﻿#include "pptmainwindow.h"
#include "ui_pptmainwindow.h"
#include<iostream>
using namespace std;

//初始化样式
void pptMainWindow::iniUI()
{

    ui->statusBar->hide();//隐藏状态栏
    ui->mainToolBar->hide();//隐藏工具栏
    addShadow(*ui->outText);
    addShadow(*ui->label);
    addShadow(*ui->copyRight);
    QFile file(":/qss/ui.qss");
    file.open(QFile::ReadOnly);
    if(file.isOpen())
    {
        QString style=QLatin1String(file.readAll());
        ui->centralWidget->setStyleSheet(style);

        ui->oldInput->setStyleSheet(style);
        ui->newInput->setStyleSheet(style);
        ui->videoPath->setStyleSheet(style);
        ui->picPath->setStyleSheet(style);
        ui->pptPicPath->setStyleSheet(style);
        ui->pptPath->setStyleSheet(style);
        //按钮
        ui->btnRun->setStyleSheet(style);

        //输出文本
        ui->outText->setStyleSheet(style);

        file.close();
    }
    else
    {
        qDebug("Open failed");
    }
    //设置窗体透明
    this->setAttribute(Qt::WA_TranslucentBackground, true);
    //设置无边框
//    this->setWindowFlags(Qt::Window | Qt::FramelessWindowHint);
}

//增加ListView阴影
void pptMainWindow::addShadow(QWidget& name)
{
//    ui->outText->setStyleSheet("background: #FFFFFF;");
    QGraphicsDropShadowEffect *shadow_effect = new QGraphicsDropShadowEffect(this);
    shadow_effect->setOffset(0, 0);              //阴影的偏移量
    shadow_effect->setColor(QColor(68, 43, 43)); //阴影的颜色
    shadow_effect->setBlurRadius(20);             // 阴影圆角的大小
    name.setGraphicsEffect(shadow_effect); //给那个控件设置阴影，这里需要注意的是所有此控件的子控件，也都继承这个阴影。
}

//运行python脚本
void pptMainWindow::runPython(QString oldInputText,QString newInputText,QString videoPathText,QString picPathText,QString pptPicPathText,QString pptPathText)
{
    process1 = new QProcess(this);
//    //方式一：首先调用控制台，再通过控制台启动程序。（控制台：mac/linux下调用bash，windows下是cmd.exe）
//    process1->start("cmd.exe");//调用控制台程序
//    process1->waitForStarted();//等待程序确实启动再往下走
//    process1->write("dir\n");//输入查看当前目录的命令试试。加\n代表控制台中都回车。（查看当前目录命令：linux是 ls，windows 是dir）
//    process1->write("python haha.py");
    //方式2
    QStringList pythonStr;
//    pythonStr.append("haha.py"+" -old "+oldInputText.toStdString()+" -new "+newInputText.toStdString()+" -i "+videoPathText.toStdString()
//                     +" -o "+picPathText.toStdString()+" -pic "+pptPicPathText.toStdString()+" -ppt "+pptPathText.toStdString());
    pythonStr.append("ppt.py");
    pythonStr.append("-old");
    pythonStr.append(oldInputText);
    pythonStr.append("-new");
    pythonStr.append(newInputText);
    pythonStr.append("-i");
    pythonStr.append(videoPathText);
    pythonStr.append("-o");
    pythonStr.append(picPathText);
    pythonStr.append("-pic");
    pythonStr.append(pptPicPathText);
    pythonStr.append("-ppt");
    pythonStr.append(pptPathText);
    if(process1->state()==0)
    {
        begin();
    }
    process1->start("python",pythonStr);//直接启动python程序，而不是通过bash。
    process1->waitForStarted();//等待程序确实启动
}

//信号与槽连接
void pptMainWindow::iniSignalSlots()
{
    //信号槽连接，一旦获取到程序输出就调用OnReadData函数
    connect(process1,SIGNAL(readyReadStandardOutput()),this,SLOT(OnReadData()));
}

//提示框
void pptMainWindow::set_Message(QString text)
{
    //简单计算一下其显示的坐标
    int x, y;
    x = this->pos().x() + this->width() / 2 - m_widget->width() / 2;
    y = this->pos().y();
    //设置控件显示的位置
    m_widget->setGeometry(x,y, m_widget->width(),m_widget->height());
    m_widget->set_Message(text);
    m_widget->show();
}

//开始动画
void pptMainWindow::begin()
{
    ui->label->setText("开   始");
    ui->label->show();
    QPropertyAnimation *animation = new QPropertyAnimation(ui->label, "geometry");
    animation->setDuration(2000);
    animation->setStartValue(QRect(ui->label->pos().x(), ui->label->pos().y(), 0, 0));
    animation->setEndValue(QRect(ui->label->pos().x(), ui->label->pos().y(), ui->label->width(), ui->label->height()));
    animation->setEasingCurve(QEasingCurve::Linear);//渐变时间曲线
    animation->start();
    connect(animation, &QPropertyAnimation::finished, ui->label, [=]{ui->label->hide(); });
}

void pptMainWindow::end(char* path)
{
    //    QLabel *label=new QLabel();
    //    QImage image(":/logo/pptx.ico");
    //    ui->picLabel->setPixmap(QPixmap::fromImage(image));
    //    ui->picLabel->show();
        ui->picLabel->show();
        ui->picLabel->resize(ui->picLabel->width(),ui->picLabel->height());
        QPixmap pix(path);
        QPixmap dest=pix.scaled(ui->picLabel->size(),Qt::KeepAspectRatio);//自适应图片大小
        ui->picLabel->setPixmap(dest);
        QPropertyAnimation *animation = new QPropertyAnimation(ui->picLabel, "geometry");
        animation->setDuration(1500);
        animation->setStartValue(QRect(ui->picLabel->pos().x(), ui->picLabel->pos().y(), 0, 0));
        animation->setEndValue(QRect(ui->picLabel->pos().x(), ui->picLabel->pos().y(), ui->picLabel->width(), ui->picLabel->height()));
        animation->setEasingCurve(QEasingCurve::Linear);//渐变时间曲线
        animation->start();
}
//槽函数
void pptMainWindow::OnReadData()
{

    strResult = QString::fromUtf8(process1->readAll().data());
    process1->close();
    process1->kill();

    ui->outText->appendPlainText(strResult);
    //最后是干完活了就打印输出结束动画
    if(strResult.trimmed().endsWith("干完活了"))
    {
        end(":/logo/pptx.ico");
    }
    else
    {
        end(":/fail/fail.ico");
    }
}

pptMainWindow::pptMainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::pptMainWindow)
{
    ui->setupUi(this);
    m_widget=new message();
    iniUI();
}

pptMainWindow::~pptMainWindow()
{
    //别忘了 杀死调用的进程
    process1->kill();
    process1->close();
    delete  process1;
    delete m_widget;
    delete ui;
}

//点击事件
void pptMainWindow::on_btnRun_clicked(bool checked)
{
    QString oldInputText=ui->oldInput->text();
    QString newInputText=ui->newInput->text();
    QString videoPathText=ui->videoPath->text();
    QString picPathText=ui->picPath->text();
    QString pptPicPathText=ui->pptPicPath->text();
    QString pptPathText=ui->pptPath->text();
    //判断输入格式正确与否
    if(videoPathText.isEmpty())
    {
        set_Message("视频文件夹不为空!");
    }
    else if(picPathText.isEmpty())
    {
        set_Message("图片文件夹不为空!");
    }
    else if(pptPicPathText.isEmpty())
    {
        set_Message("生成图片文件夹不为空!");
    }
    else if(pptPathText.isEmpty())
    {
        set_Message("PPT文件路径不为空!");
    }
    else if(!videoPathText.endsWith("/"))
    {
        set_Message("视频文件夹结尾处需加上/");
    }
    else if(!picPathText.endsWith("/"))
    {
        set_Message("图片文件夹结尾处需加上/");
    }
    else if(!pptPicPathText.endsWith("/"))
    {
        set_Message("生成图片文件夹结尾处需加上/");
    }
    else if(!pptPathText.endsWith("pptx"))
    {
        set_Message("需加上ppt后缀pptx");
    }
    else
    {
        ui->picLabel->hide();//运行之前隐藏结束动画标签
        runPython(oldInputText,newInputText,videoPathText,picPathText,pptPicPathText,pptPathText);
        iniSignalSlots();
    }
}
